package qqmeeting

// API LIST
var (
	RequestDescriptorMeetingCreate                        = MeetingRequestDescriptor{"/meetings", "POST", "Create"}
	RequestDescriptorMeetingQueryByID                     = MeetingRequestDescriptor{"/meetings/%s", "GET", "ID"}
	RequestDescriptorMeetingQueryByCode                   = MeetingRequestDescriptor{"/meetings", "GET", "Code"}
	RequestDescriptorMeetingCancelByID                    = MeetingRequestDescriptor{"/meetings/%s/cancel", "POST", "CANCEL"}
	RequestDescriptorMeetingUpdateByID                    = MeetingRequestDescriptor{"/meetings/%s", "PUT", "UPDATE"}
	RequestDescriptorMeetingQueryParticipantsByID         = MeetingRequestDescriptor{"/meetings/%s/participants", "GET", "QUERY"}
	RequestDescriptorMeetingQueryUserMeetingList          = MeetingRequestDescriptor{"/meetings", "GET", "QUERY_MEETING_LIST"}
	RequestDescriptorUserCreate                           = MeetingRequestDescriptor{"/users", "POST", "Create"}
	RequestDescriptorUserDetailQuery                      = MeetingRequestDescriptor{"/users/%s", "GET", "QUERY"}
	RequestDescriptorUserUpdate                           = MeetingRequestDescriptor{"/users/%s", "PUT", "UPDATE"}
	RequestDescriptorUserDelete                           = MeetingRequestDescriptor{"/users/%s", "DELETE", "DELETE"}
	RequestDescriptorUserList                             = MeetingRequestDescriptor{"/users/list", "GET", "QUERY"}
	RequestDescriptorMeetingCustomerShortUrl              = MeetingRequestDescriptor{"/meetings/customer-short-url", "POST", "CUSTOMER_SHORT_URL"}
	RequestDescriptorMeetingSignIn                        = MeetingRequestDescriptor{"/meetings/sign-in", "POST", "SIGN_IN"}
	RequestDescriptorMeetingQuerySignInList               = MeetingRequestDescriptor{"/meetings/sign-in/list", "GET", "QUERY_SIGN_IN_LIST"}
	RequestDescriptorMeetingQuerySignInEventList          = MeetingRequestDescriptor{"/meetings/sign-in", "GET", "QUERY_SIGN_IN_EVENT_LIST"}
	RequestDescriptorRealControlMeetingCoHosts            = MeetingRequestDescriptor{"/real-control/meetings/%s/cohosts", "PUT", "REAL_CONTROL_MEETING_CO_HOSTS"}
	RequestDescriptorRealControlMeetingMutes              = MeetingRequestDescriptor{"/real-control/meetings/%s/mutes", "PUT", "REAL_CONTROL_MEETING_CO_MUTES"}
	RequestDescriptorMeetingDismissByID                   = MeetingRequestDescriptor{"/meetings/%s/dismiss", "POST", "DISMISS"}
	RequestDescriptorMeetingQueryRealTimeParticipantsByID = MeetingRequestDescriptor{"/meetings/%s/real-time-participants", "GET", "QUERY"}
	RequestDescriptorRecordAddressesQuery                 = MeetingRequestDescriptor{"/addresses/%s", "GET", "RECORD_ADDRESS_QUERY"}
	RequestDescriptorRecordsQuery                         = MeetingRequestDescriptor{"/records", "GET", "RECORDS_QUERY"}
	RequestDescriptorLivePlayLiveStreamAddressUpdate      = MeetingRequestDescriptor{"/meetings/%s/live_play/live-stream-address", "POST", "LIVE_PLAY_LIVE_STREAM_ADDRESS"}
)

// UserObj  用户对象 https://cloud.tencent.com/document/product/1095/42417
type UserObj struct {
	UserID      string  `json:"userid"`              // 调用方用于标示用户的唯一 ID
	IsAnonymous *bool   `json:"is_anonymous"`        // 匿名入会
	NickName    *string `json:"nick_name,omitempty"` // 用户匿名字符串
}

// 会议设置
type Settings struct {
	MuteEnableJoin             *bool   `json:"mute_enable_join,omitempty"`              // 入会时静音
	AllowUnmuteSelf            *bool   `json:"allow_unmute_self,omitempty"`             // 允许参会者取消静音
	PlayIvrOnLeave             *bool   `json:"play_ivr_on_leave,omitempty"`             // 参会者离开时播放提示音
	PlayIvrOnJoin              *bool   `json:"play_ivr_on_join,omitempty"`              // 有新的与会者加入时播放提示音
	AllowInBeforeHost          *bool   `json:"allow_in_before_host,omitempty"`          // 是否允许成员在主持人进会前加入会议
	AutoInWaitingRoom          *bool   `json:"auto_in_waiting_room,omitempty"`          // 是否开启等候室
	AllowScreenSharedWatermark *bool   `json:"allow_screen_shared_watermark,omitempty"` // 是否开启屏幕共享水印
	WaterMarkType              *int    `json:"water_mark_type,omitempty"`               // 水印样式
	OnlyEnterpriseUserAllowed  *bool   `json:"OnlyEnterpriseUserAllowed,omitempty"`     // 是否仅企业内部成员可入会
	AutoRecordType             *string `json:"auto_record_type,omitempty"`              // 自动会议录制类型
	ParticipantJoinAutoRecord  *bool   `json:"participant_join_auto_record,omitempty"`  // 当有参会成员入会时立即开启云录制，默认值为 false 关闭，关闭时，主持人入会自动开启云录制；当设置为开启时，则有参会成员入会自动开启云录制
	EnableHostPauseAutoRecord  *bool   `json:"enable_host_pause_auto_record,omitempty"` // 允许主持人暂停或者停止云录制，默认值为 true 开启，开启时，主持人允许暂停和停止云录制；当设置为关闭时，则主持人不允许暂停和关闭云录制
	AllowMultiDevice           *bool   `json:"allow_multi_device,omitempty"`            // 是否允许成员多端入会
}

// 直播配置
type LiveConfig struct {
	LiveSubject        *string `json:"live_subject,omitempty"`         // 直播主题
	LiveSummary        *string `json:"live_summary,omitempty"`         // 直播简介
	EnableLivePassword *bool   `json:"enable_live_password,omitempty"` // 是否开启直播密码
	LivePassword       *string `json:"live_password,omitempty"`        // 直播密码
	EnableLiveIm       *bool   `json:"enable_live_im,omitempty"`       // 允许观众讨论
	EnableLiveReplay   *bool   `json:"enable_live_replay,omitempty"`   // 开启直播回看
	LiveAddr           *string `json:"live_addr,omitempty"`            // 直播观看地址
}

// 用户信息
type UserInfo struct {
	Email    string `json:"email" binding:"required"`    // 邮箱地址
	Phone    string `json:"phone" binding:"required"`    // 手机号码
	Username string `json:"username" binding:"required"` // 用户昵称
	UserID   string `json:"userid" binding:"required"`   // 调用方用于表示用户的唯一ID
}

// 用户详情
type UserDetail struct {
	Username   string `json:"username"`    // 用户昵称
	UpdateTime string `json:"update_time"` // 更新时间
	Status     string `json:"status"`      // 用户状态，1：正常；2：删除
	Email      string `json:"email"`       // 邮箱地址
	Phone      string `json:"phone"`       // 手机号码
	UserID     string `json:"userid"`      // 调用方用于标示用户的唯一 ID
	AreaCode   string `json:"area"`        // 地区编码（国内默认86）
	AvatarUrl  string `json:"avatar_url"`  // 头像
}

// 会议信息
type MeetingInfo struct {
	MeetingID    string      `json:"meeting_id"`             // 会议的唯一标示
	MeetingCode  string      `json:"meeting_code"`           // 会议 App 的呼入号码
	Subject      string      `json:"subject"`                // 会议主题
	Hosts        []*UserObj  `json:"hosts,omitempty"`        // 会议主持人的用户 ID，如果没有指定，主持人被设定为参数 userid 的用户，即 API 调用者。
	Participants []*UserObj  `json:"participants,omitempty"` // 会议邀请的参会者，可为空
	StartTime    string      `json:"start_time"`             // 会议开始时间戳（单位秒）。
	EndTime      string      `json:"end_time"`               // 会议结束时间戳（单位秒）。
	Password     *string     `json:"password,omitempty"`     // 会议密码，可不填
	JoinUrl      string      `json:"join_url"`               // 加入会议　URL（点击链接直接加入会议）
	Settings     *Settings   `json:"settings,omitempty"`     // 会议设置
	EnableLive   bool        `json:"enable_live,omitempty"`  // 是否开启直播
	LiveConfig   *LiveConfig `json:"live_config,omitempty"`  // 直播配置对象
	HostKey      string      `json:"host_key,omitempty"`     // 主持人密钥，仅支持6位数字
}

// 带状态的会议信息
type MeetingQueryInfo struct {
	MeetingInfo
	Status string `json:"status"` // 当前会议状态
}

// 简要会议信息
type SimplifiedMeetingInfo struct {
	MeetingID   string      `json:"meeting_id"`
	MeetingCode string      `json:"meeting_code"`
	EnableLive  bool        `json:"enable_live,omitempty"` // 是否开启直播
	LiveConfig  *LiveConfig `json:"live_config,omitempty"` // 直播配置对象
	HostKey     string      `json:"host_key,omitempty"`    // 主持人密钥，仅支持6位数字
}

// 参会人员信息
type MeetingParticipants struct {
	UserID                string `json:"userid"`              // 参会者用户 ID。
	MsOpenID              string `json:"ms_open_id"`          // 当场会议的用户临时 ID，可用于会控操作，适用于所有用户
	Uuid                  string `json:"uuid"`                // 用户的身份 ID，仅适用于单场会议
	Base64EncodedUsername string `json:"user_name"`           // 入会用户名（base64）
	SHA256HashedPhone     string `json:"phone"`               // 参会者手机号 hash 值 SHA256（手机号/secretid）
	IsEnterpriseUser      bool   `json:"is_enterprise_user"`  // 是否是企业内部成员
	JoinTime              string `json:"join_time"`           // 参会者加入会议时间戳（单位秒）。
	LeftTime              string `json:"left_time"`           // 参会者离开会议时间戳（单位秒）。
	InstanceID            int    `json:"instanceid"`          // 用户的终端设备类型
	UserRole              int    `json:"user_role"`           // 用户角色
	JoinType              int    `json:"join_type"`           // 入会方式
	CustomerData          string `json:"customer_data"`       // 用户专属字段
	AppVersion            string `json:"app_version"`         // 用户的客户端版本。当用户在会中时才能返回
	AudioState            bool   `json:"audio_state"`         // 麦克风状态
	VideoState            bool   `json:"video_state"`         // 摄像头状态
	ScreenSharedState     bool   `json:"screen_shared_state"` // 屏幕共享状态
}

// 查询用户的会议列表中会议对象
type MeetingQueryUserListMeetingInfo struct {
	MeetingID       string     `json:"meeting_id"`        // 会议的唯一标示
	MeetingCode     string     `json:"meeting_code"`      // 会议 App 的呼入号码
	Subject         string     `json:"subject"`           // 会议主题
	Hosts           []*UserObj `json:"hosts,omitempty"`   // 会议主持人的用户 ID，如果没有指定，主持人被设定为参数 userid 的用户，即 API 调用者。
	StartTime       string     `json:"start_time"`        // 会议开始时间戳（单位秒）。
	EndTime         string     `json:"end_time"`          // 会议结束时间戳（单位秒）。
	JoinMeetingRole string     `json:"join_meeting_role"` // 查询者在会议中的角色
}

// 自定义信息对象
type MeetingCustomerDataInfo struct {
	CustomerData    string `json:"customer_data"`
	MeetingShortUrl string `json:"meeting_short_url"`
}

type SignInInfo struct {
	SignInID            string `json:"sign_in_id"`                      // 签到 ID
	StartTime           int32  `json:"start_time"`                      // 签到开始时间戳（秒）
	SignInSpecification string `json:"sign_in_specification,omitempty"` // 签到说明
	SignInStatus        int8   `json:"sign_in_status"`                  // 签到状态
}

type SignInEvent struct {
	MsOpenID          string `json:"ms_open_id"`          // 当场会议的用户临时 ID，可用于会控操作，适用于所有用户
	UserID            string `json:"userid,omitempty"`    // 企业唯一用户标识，当与主持人为同企业时返回 userid
	OpenID            string `json:"open_id"`             // 已授权用户的 ID。 使用第三方应用鉴权方式（OAuth2.0）时，该值为已授权用户的 open_id。 其他情况为空
	UserName          string `json:"user_name"`           // 用户昵称
	UserRole          string `json:"user_role"`           // 用户角色
	WebinarMemberRole string `json:"webinar_member_role"` // 网络研讨会成员角色
	SignInTime        int32  `json:"sign_in_time"`        // 签到时间，按时间正序排列
}

type RealControlUser struct {
	ToOperatorID     string `json:"to_operator_id"`      // 被操作者 ID
	ToOperatorIDType int    `json:"to_operator_id_type"` // 被操作者 ID 的类型: 4：ms_open_id
	Uuid             string `json:"uuid"`                // 被操作者用户唯一身份 ID
	InstanceID       int    `json:"instanceid"`          // 用户的终端设备类型
}

// 录制
type RecordMeeting struct {
	MeetingRecordID string               `json:"meeting_record_id"` // 会议录制 ID
	MeetingID       string               `json:"meeting_id"`        // 会议 ID
	MeetingCode     string               `json:"meeting_code"`      // 会议 code
	MediaSetType    int                  `json:"media_set_type"`    // 会议类型
	HostUserID      string               `json:"host_user_id"`      // 会议创建者 ID
	MediaStartTime  int64                `json:"media_start_time"`  // 会议开始时间，UNIX 时间戳（单位毫秒）
	Subject         string               `json:"subject"`           // 会议主题
	State           int                  `json:"state"`             // 录制状态
	RecordFiles     []*RecordMeetingFile `json:"record_files"`      // 录制文件列表
}

type RecordMeetingFile struct {
	RecordFileID        string `json:"record_file_id"`       // 录制文件 ID
	RecordStartTime     int64  `json:"record_start_time"`    // 开始录制时间，UNIX 时间戳（单位毫秒）
	RecordEndTime       int64  `json:"record_end_time"`      // 结束录制时间，UNIX 时间戳（单位毫秒）
	RecordSize          int    `json:"record_size"`          // 文件大小（单位字节）
	SharingState        int    `json:"sharing_state"`        // 共享状态，是否开启共享
	SharingUrl          string `json:"sharing_url"`          // 共享链接，开启共享时返回
	RequiredSameCorp    bool   `json:"required_same_corp"`   // 仅企业用户可查看，开启共享时返回
	RequiredParticipant bool   `json:"required_participant"` // 仅参会成员可查看，开启共享时返回
	Password            string `json:"password"`             // 访问密码，开启共享时返回
	SharingExpire       int64  `json:"sharing_expire"`       // 共享链接有效期（单位毫秒），当未开启共享时，返回0表示永久有效；开启共享时返回
	AllowDownload       bool   `json:"allow_download"`       // 是否允许下载，开启共享时返回
}

type RecordAddressMeetingSummary struct {
	DownloadAddress string `json:"download_address"`
	FileType        string `json:"file_type"`
}

type RecordAddressMeetingTranscripts struct {
	DownloadAddress string `json:"download_address"` // 录制转写文件下载文件地址，链接有效期为5分钟
	FileType        string `json:"file_type"`        // 下载文件类型
}

type RecordAddressMinutes struct {
	DownloadAddress string `json:"download_address"` // 智能纪要文件下载文件地址，链接有效期为5分钟
	FileType        string `json:"file_type"`        // 下载文件类型
}

type LivePushStreamInfo struct {
	PlatformType     int    `json:"platform_type"`      // 推流平台类型: 1：微信视频号平台; 2：第三方推流平台
	PlatformName     string `json:"platform_name"`      // 推流平台名称。（base64 编码）
	EnablePushAddres bool   `json:"enable_push_addres"` // 是否启用该推流地址，默认值为 true。
	PushAddress      string `json:"push_address"`       // 推流地址
	PushPassword     string `json:"push_password"`      // 推流密钥
}
